//package com.hc.demo.service;
//
//import com.hc.demo.domain.Person;
//import org.springframework.stereotype.Service;
//
//@Service
//public class PersonService {
//    public Person login(Person person){
//        System.out.println("service out put person:"+person.getName()+","+person);
//        return person;
//    }
//}
package com.hc.demo.service;

import com.hc.demo.domain.Person;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import jakarta.annotation.PostConstruct; // 注意包名是 jakarta 而非 javax
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Slf4j
@Service
public class PersonService {

    // `personList` 是一个内存中的集合对象
    /**
     * 1. **数据存储在内存中**：所有添加的 `Person` 对象都保存在应用程序的内存里，而非硬盘或数据库
     * 2. **生命周期与应用一致**：只要
     *    - 应用运行期间，数据会一直保存在内存中，支持添加、查询、修改、删除等操作
     *    - 一旦应用重启或关闭，内存中的数据会全部丢失（这是与数据库的核心区别）
     * 3. **无需依赖外部存储**：不需要配置数据库连接，直接额外的存储服务，适合快速开发和测试
     */
    private final List<Person> personList = new ArrayList<>();

    // 初始化方法，项目启动时自动执行
    @PostConstruct
    public void init() {
        Person defaultUser = new Person("admin", "123456");
        personList.add(defaultUser);
        log.info("已初始化默认账号：用户名={}, 密码={}", defaultUser.getName(), defaultUser.getPassword());
    }

    // 登录验证
    public boolean login(Person person) {
        log.info("登录验证: 用户名={}, 密码={}", person.getName(), person.getPassword());
        boolean success = personList.stream()
                .anyMatch(p -> p.getName().equals(person.getName())
                        && p.getPassword().equals(person.getPassword()));
        log.info("登录{}: 用户名={}", success ? "成功" : "失败", person.getName());
        return success;
    }

    public List<Person> getPersonList() {
        return new ArrayList<>(personList);
    }

    // 添加人员
    public boolean addPerson(Person person) {
        if (personList.stream().anyMatch(p -> p.getName().equals(person.getName()))) {
            log.warn("添加失败，用户名已存在: 用户名={}", person.getName());
            return false;
        }
        personList.add(person);
        log.info("添加成功: 用户名={}, 密码={}", person.getName(), person.getPassword());
        return true;
    }

    public Optional<Person> getPersonByName(String name) {
        return personList.stream()
                .filter(p -> p.getName().equals(name))
                .findFirst();
    }

    // 修改人员
    public boolean updatePerson(Person person) {
        return getPersonByName(person.getName()).map(p -> {
            String oldPassword = p.getPassword();
            p.setPassword(person.getPassword());
            log.info("更新成功: 用户名={}, 原密码={}, 新密码={}",
                    person.getName(), oldPassword, person.getPassword());
            return true;
        }).orElseGet(() -> {
            log.warn("更新失败，用户不存在: 用户名={}", person.getName());
            return false;
        });
    }

    // 删除人员
    public boolean deletePerson(String name) {
        Optional<Person> person = getPersonByName(name);
        boolean removed = personList.removeIf(p -> p.getName().equals(name));
        if (removed) {
            log.info("删除成功: 用户名={}, 密码={}", name, person.get().getPassword());
        } else {
            log.warn("删除失败，用户不存在: 用户名={}", name);
        }
        return removed;
    }
}
